﻿// <copyright file="RelayCommand.cs" company="Waveform Lab.NET">
// Signal processing by PC oscilloscope
// http://waveformlab.codeplex.com/
//
// Copyright (c) 2011 Waveform Lab.NET
//
// Permission is hereby granted, free of charge, to any person
// obtaining a copy of this software and associated documentation
// files (the "Software"), to deal in the Software without
// restriction, including without limitation the rights to use,
// copy, modify, merge, publish, distribute, sublicense, and/or sell
// copies of the Software, and to permit persons to whom the
// Software is furnished to do so, subject to the following
// conditions:
//
// The above copyright notice and this permission notice shall be
// included in all copies or substantial portions of the Software.
//
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES
// OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
// HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
// WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
// FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
// OTHER DEALINGS IN THE SOFTWARE.
// </copyright>

using System.Windows.Input;
using System.ComponentModel;
using System;

namespace PluginModule.Core.MVVM
{
    public sealed class RelayCommand : ICommand
    {
        private readonly Predicate<object> _objCanExecuteMethod = null;
        private readonly Action<object> _objExecuteMethod = null;

        public event EventHandler CanExecuteChanged
        {
            add
            {
                if (_objCanExecuteMethod != null)
                    CommandManager.RequerySuggested += value;
            }
            remove
            {
                if (_objCanExecuteMethod != null)
                    CommandManager.RequerySuggested -= value;
            }
        }

        public RelayCommand(Action<object> objExecuteMethod)
            : this(objExecuteMethod, null)
        {
        }

        public RelayCommand(Action<object> objExecuteMethod, Predicate<object> objCanExecuteMethod)
        {
            if (objExecuteMethod == null)
                throw new ArgumentNullException("objExecuteMethod", "Delegate comamnds can not be null");

            _objExecuteMethod = objExecuteMethod;
            _objCanExecuteMethod = objCanExecuteMethod;
        }

        public bool CanExecute(object parameter)
        {
            if (_objCanExecuteMethod == null)
                return true;
            else
                return _objCanExecuteMethod(parameter);
        }

        public void Execute(object parameter)
        {
            if (_objExecuteMethod == null)
                return;
            else
                _objExecuteMethod(parameter);
        }

#if SILVERLIGHT
        public static class CommandManager
        {
            public static event EventHandler RequerySuggested;

            /// <summary>
            /// <see cref="RequerySuggested"/> イベントを発生させます。
            /// </summary>
            public static void FireRequerySuggested()
            {
                var handler = RequerySuggested;
                if (handler != null)
                {
                    handler(null, EventArgs.Empty);
                }
            }
        }
#endif

    }
}
